Skip to main content

3-20 128. 最长连续序列

Date:2022-03-20 07:45:57

标签:

  • 哈希表

    枚举x,找x+1,x+2,x+n最大可能,注意跳过x-1成立的元素,因为成立时,必有更长的串

题目:128. 最长连续序列 ( 中等😕 )

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例

示例1:

输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4

示例2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

分析

  • 排序法

    先排序,再找连续最大的序列,思路最简单,但时间复杂度为O(nlogn)(排序算法最小复杂度)

    不满足题目O(n)时间复杂度要求

  • 哈希表

    枚举每一个值,并且在数组中找出所有满足x,x+1,x+2的最长序列

    注意一个条件:如果当前元素-1存在,则跳过,因为从左向右遍历,如果x-1存在于哈希表中,那说明一定有更长的序列

    时间复杂度O(n)

  • 其他方法

    还有动态规划、并查集等方法.https://leetcode-cn.com/problems/longest-consecutive-sequence/solution/xiao-bai-lang-ha-xi-ji-he-ha-xi-biao-don-j5a2/

题解

这里只看哈希表法

function longestConsecutive(nums: number[]): number {
const len = nums.length
let max = 0

const num_set = new Set<number>()
for (let i = 0; i < len; ++i) {
num_set.add(nums[i])
}

num_set.forEach((num) => {
if (num_set.has(num - 1)) {
return
}

let currentNum = num
let sum = 1 // include self, so it is 1

while (num_set.has(currentNum + 1)) {
++currentNum
++sum
}

max = Math.max(max, sum)
})

return max
}

使用

function main() {
// const nums = [100, 4, 200, 1, 3, 2]
// const nums = [0, 3, 7, 2, 5, 8, 4, 6, 0, 1]
const nums = [9, 1, 4, 7, 3, -1, 0, 5, 8, -1, 6]

console.log('[]:', longestConsecutive(nums))
}

main()

export {}